package com.cskaoyan.javase.oop1._10static._3usecase;

/**
 * static关键字的使用场景
 * 1.静态成员变量的使用场景
 *  静态成员变量的特征:
 *      a.属于类,被全体对象共享
 *      b.在整个类的全局是唯一的
 *  所以当存在需要所有对象共享的变量时，应该使用static修饰的静态成员变量。
 *  所以，如果希望某个变量在类的全局独一份时，应该使用static修饰的静态成员变量。
 *
 * 2.静态成员方法的使用场景
 *      静态成员方法和普通的成员方法相比,有什么特征/特殊点:
 *      它最大的优点是不需要创建对象就可以直接调用
 *      所以开发中,为了方便,可以选择将方法定义为静态成员方法,以便于调用的
 *
 *  特殊的,当一个类当中的所有方法都是静态方法时,可以直接"类名."得到所需要的所有功能
 *  完全不需要创建该类的对象
 *  这种类,就是Java中的工具类
 *  比如:
 *          java.lang.Math 数学工具类
 *          java.util.Arrays 数组工具类
 *
 * @since 16:22
 * @author wuguidong@cskaoyan.onaliyun.com
 */
public class Demo {
    public static void main(String[] args) {
        for (int i = 0; i < 5; i++) {
            Student s = new Student("张三");
            System.out.println(s.stuId);
        }
        System.out.println(Student.count);
    }
}

class Student {
    String name;
    int stuId;

    static int initId = 10001;

    // 需求1:要求统计,在外部new创建Student对象的次数,怎么做呢?
    /*
        首先需要一个count计数器,把次数存起来,每new一次对象就+1
        这个count应该是整个类全局唯一的,被共享的,所以是静态成员变量
      */
    static int count = 0;

    // 需求2: stuId会根据对象的创建次数赋值,第一次赋值为10001,第二次是10002....

    public Student(String name) {
        stuId = initId;
        this.name = name;
        count++;
        initId++;
    }
}